package com.jpa.lgt.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * @author lgt
 * @time 2018/8/13
 * @description：设备类型
 * 实体使用了jpa的@oneToMany 和lombok的@Data
 *在运行过程中调用关联表数据时显示异常 java.lang.stackoverflowerror
 * 1.不使用lazy加载
 * 2.@Data 替换为@Getter,@Setter等方法
 * 3.保留@Data，添加@EqualsAndHashCode(exclude="关联表属性") 实现hasCode和equals方法时忽略关联属性
 *
 */
@Data
@EqualsAndHashCode(exclude = "deviceSet")
@Entity
public class DeviceType {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)

    private Integer deviceTypeId;

    @JsonProperty("name")
    //@Column(name="device_type_name",length=50,nullable=true)//nullable false表示此字段不能为空
    private String deviceTypeName;

    //实体类字段与数据库关键字冲突解决,需要用[]括起来
    @Column(name="[system]",length=50)
    private String system;

    @JsonIgnore
    private String fDeviceType;

    //映射单向一对多的关联关系
    //使用@OneToMany 来映射一对多的关联关系
    //使用@JoinColumn 来映射外键列的名称
    //可以使用@OneToMany的fetch 属性来修改默认的加载策略
    //可以通过@OneToMany的cascade 属性来修改默认的删除策略
    //cascade={CascadeType.REMOVE} 会把主表和从表的数据都删除
    //mappedBy表明放弃关联关系维护并且不能在使用
    //注意：若在一的一端@oneToMany 中使用mapperBy属性，则@oneToMany端就不能在使用@JoinColumn(name="CUSTOMER_ID")属性
    //mapperBy为了删除从表的某个数据时，不会删及主表
    //@JoinColumn(name="CUSTOMER_ID")
    @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.ALL},mappedBy="deviceType")
    private Set<HomeDevice> deviceSet=new HashSet<>();
    /*工具方法，不需要映射为数据表的一列
    @Transient
    public String getInfo(){
        return "deviceTypeName:"+deviceTypeName+",system:"+system;
    }*/

    /*public Integer getDeviceTypeId() {
        return deviceTypeId;
    }

    public void setDeviceTypeId(Integer deviceTypeId) {
        this.deviceTypeId = deviceTypeId;
    }

    public String getDeviceTypeName() {
        return deviceTypeName;
    }

    public void setDeviceTypeName(String deviceTypeName) {
        this.deviceTypeName = deviceTypeName;
    }

    public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }

    public String getfDeviceType() {
        return fDeviceType;
    }

    public void setfDeviceType(String fDeviceType) {
        this.fDeviceType = fDeviceType;
    }

    public Set<HomeDevice> getDeviceSet() {
        return deviceSet;
    }

    public void setDeviceSet(Set<HomeDevice> deviceSet) {
        this.deviceSet = deviceSet;
    }
*/
    public DeviceType() {
    }

    public DeviceType(Integer deviceTypeId) {
        this.deviceTypeId=deviceTypeId;
    }


}
